from docx import Document
from docx.shared import Pt  # 设置像素、缩进等
from docx.shared import Cm
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from .Matrix import Matrix
import copy


class Supporting_Course():
    def __init__(self, path, uerid):
        self.path = path
        self.uerid = uerid
        self.doc = Document()
        self.matrix = Matrix(path, uerid)
        self.firidx_data = {}
        self.secidx_data = {}
        self.table = self.doc.add_table(rows=0, cols=0, style="Table Grid")
        self.gra_req_data = {}
        self.idx_point = {}

    def init(self,year):
        self.matrix.Get_num_colnum_dict()
        self.matrix.GetCourseData(year)
        self.matrix.Get_index_point()
        self.matrix.AddContent()
        self.matrix.MergeCell()
        self.matrix.TextCentered()
        self.matrix.SetCellSize()
        self.matrix.style_excel(self.matrix.ws)
        # matrix.wb.save(matrix.path + "Matrix.xlsx")

    def get_support_dict(self):
        # ------------提取数据  得到主要支撑课程
        # {"1":{"1":["高等数学","数值分析","线性代数","概率论与数理统计","大学物理"]}}
        # data={"1":{"1":["高等数学","数值分析","线性代数","概率论与数理统计","大学物理"]}}
        # print(data["1"]["1"])
        # data["1"]["1"].append("666")
        # print(data["1"]["1"])
        # 生成每一级的字典套字典再套列表    列表为空

        for fir in self.matrix.index_point_sum:
            for sec in range(1, int(self.matrix.index_point_sum[fir]) + 1):
                self.secidx_data[str(sec)] = []
            # self.firidx_data[fir] = self.secidx_data
            self.firidx_data[fir] = copy.deepcopy(self.secidx_data)  # 深拷贝
            self.secidx_data = {}

        print(self.firidx_data)

        # 根据matrix.course_content  将firidx_data 中的内容补全
        print(self.matrix.course_content)
        for content in self.matrix.course_content:  # 枚举所有课程
            course_name = ""
            for idx, con_data in enumerate(content):  # 枚举所有课程名称和指标点
                if idx == 0:  # 得到课程名称
                    course_name = con_data
                else:  # 枚举课程指标点
                    if con_data == None:
                        continue
                    str_idx = ""  # 指标点
                    for char_idx in con_data:
                        if char_idx == ',' or char_idx == 'H' or char_idx == 'M' or char_idx == 'L':
                            if str_idx != "":
                                string_split = str_idx.split('.')
                                fir_part = string_split[0]  # 一级指标点
                                sec_part = string_split[1]  # 二级指标点
                                self.firidx_data[fir_part][sec_part].append(course_name)
                            str_idx = ""
                            continue
                        else:
                            str_idx += char_idx

        print(self.firidx_data)

    # def set_first_title(self,major,year):
    #     table_title = self.doc.add_paragraph()
    #     f = year+'版'+ major+'专业'+''
    #     run = table_title.add_run("毕业要求指标分解与支撑课程")
    #     run.font.name = u'宋体'  # 设置字体
    #     run.font.bold = True  # 字体粗体
    #     run.font.size = Pt(15)  # 字体大小

    def set_title(self,major,year):
        table_title = self.doc.add_paragraph()
        run = table_title.add_run(major+str(year)+"毕业要求指标分解与支撑课程")
        run.font.name = u'宋体'  # 设置字体
        run.font.bold = True  # 字体粗体
        run.font.size = Pt(18)  # 字体大小

    def create_table(self):
        # 创建表格
        # 根据求二级指标点个数来创建表格
        sum = 0
        for cnt in self.matrix.index_point_sum:
            sum += int(self.matrix.index_point_sum[cnt])
        # print(matrix.index_point_sum)
        sum += 12  # 12个一级指标点和其余的二级指标点
        # print(sum)
        self.table = self.doc.add_table(rows=sum, cols=3, style="Table Grid")
        # 设置每一列的行高
        for i in range(sum):
            self.table.rows[i].height = Cm(1.5)
        self.table.cell(0, 1).width = Cm(9)  # 设置列宽
        self.table.cell(0, 2).width = Cm(9)
        self.table.style.font.size = Pt(11)  # 设置表格中所有字体的大小
        # table.style.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 设置表格中所有文字水平居中

    def fill_content(self):
        # 填写毕业要求行的数据
        col = 0
        fir_sum_data = {}  # 每一个一级指标点的数量
        for i in self.matrix.index_point_sum:
            fir_sum_data[int(i)] = int(self.matrix.index_point_sum[i])

        # print(fir_sum_data)
        for fir_idx in range(1, 13):
            fyz_cells = self.table.rows[col].cells  # 第0行的所有单元格
            fyz_cells[0].add_paragraph('毕业要求' + str(fir_idx) + '\n')
            fyz_cells[1].add_paragraph('指标点\n')
            fyz_cells[2].add_paragraph('主要支撑课程\n')
            # 合并单元格 从第col+1行0列开始合并截止到col+二级指标点个数行0列
            #           从第col+1行2列开始合并截止到col+二级指标点个数行2列
            self.table.cell(col + 1, 0).merge(self.table.cell(col + fir_sum_data[fir_idx], 0))
            self.table.cell(col + 1, 2).merge(self.table.cell(col + fir_sum_data[fir_idx], 2))
            # 填充内容  在col+1行0列填充
            fyz_cells = self.table.rows[col + 1].cells

            # 填主要支撑课程
            t = self.matrix.idx_cour_sum
            # 填充内容  在x+1行2列填充
            for sec_idx in self.firidx_data[str(fir_idx)]:
                x = sec_idx + '、'
                y = ""
                for idx, idx_data in enumerate(self.firidx_data[str(fir_idx)][sec_idx]):
                    if idx + 1 != t[str(fir_idx) + '.' + sec_idx]:
                        y += idx_data + '、'
                    else:
                        y += idx_data + ';'
                if y == "":
                    fyz_cells[2].add_paragraph(x + '无' + '\n')
                else:
                    fyz_cells[2].add_paragraph(x + y + '\n')

            # 填毕业要求内容
            fyz_cells[0].add_paragraph(self.gra_req_data[str(fir_idx)])

            # 填指标点内容
            ne_col = col + 1
            for idx_col in range(fir_sum_data[fir_idx]):
                # 填充内容  在col+1行1列填充
                fyz_cells = self.table.rows[ne_col].cells
                # print(fir_idx,type(str(idx_col+1)))
                # print(self.idx_point['1']['1'])
                # if idx_col == 0:
                # fyz_cells[1].add_paragraph(
                #     '1.1能够将工科数学与自然科学的基本知识用于对工程问题的形式化表达、建模与求解。\n')
                # print(fir_idx,idx_col)
                if idx_col+1>len(self.idx_point[str(fir_idx)]):
                    fyz_cells[1].add_paragraph("无")
                    continue
                fyz_cells[1].add_paragraph(
                    str(fir_idx) + '.' + str(idx_col + 1) + ' ' + self.idx_point[str(fir_idx)][str(idx_col + 1)])
                # elif idx_col == 1:
                #     # fyz_cells[1].add_paragraph(
                #     #     "1.2能够将程序编写、算法设计相关的基础知识和技能应用于解决计算机工程领域的具体问题。\n")
                #     fyz_cells[1].add_paragraph(
                #         str(fir_idx) + '.' + str(idx_col + 1) + ' ' + self.idx_point[str(fir_idx)][str(idx_col + 1)])
                # elif idx_col == 2:
                #     fyz_cells[1].add_paragraph(
                #         "1.3能够将计算机硬件、软件工程、计算系统等工程原理与系统知识应用于对相关系统进行分析与设计。\n")
                # elif idx_col == 3:
                #     fyz_cells[1].add_paragraph(
                #         "1.4·能够结合计算系统工程的专业知识选择相应的开发平台、工具与方法，实现对特定复杂工程问题的求解、系统设计与开发。\n")
                # else:
                ne_col += 1
            # 换到下一个毕业要求行
            col += fir_sum_data[fir_idx] + 1

    def get_data(self):
        self.gra_req_data['1'] = "工程知识：能够将数学、自然科学、计算机科学基础理论、软件、硬件及应用的基础知识、基本理论与基本方法应用于计算机科学与技术专业复杂工程问题的求解。\n"
        self.gra_req_data['2'] = '问题分析：能运用数学、自然科学计算机科学与技术的基本原理与方法，对复杂工程问题进行辩识、分析和解释数据、评价算法或系统设计方案。\n'
        self.gra_req_data['3'] = '设计/开发解决方案：能针对复杂计算工程问题设计创新解决方案，并能满足预期的需求及考虑经济，环境，社会，政治，伦理，健康，安全，可制造性，和可持续性等约束。\n'
        self.gra_req_data['4'] = '研究：能运用计算机科学与技术原理和信息获取对复杂计算工程问题进行研究并通过信息综合得到合理有效的结论。\n'
        self.gra_req_data['5'] = '使用现代工具：能运用常用测试装置、测试系统、专业仿真工具与平台，模拟、分析与预测复杂计算工程问题，并能够理解其局限性。\n'
        self.gra_req_data['6'] = '工程与社会：能够结合计算机科学与技术专业工程实践和复杂计算工程问题解决方案，理解公民与社会、健康、安全、法律、文化、知识产权、产业政策对计算工程的影响和应承担的责任。\n'
        self.gra_req_data['7'] = '环境和可持续发展：能够结合计算机科学与技术专业工程实践和复杂计算工程问题解决方案，理解和评价计算工程实践对环境、社会可持续发展的影响，以及产品周期中可能对人类和环境造成的损害和隐患。\n'
        self.gra_req_data['8'] = '职业规范：能够在计算工程实践中理解并遵守工程职业道德和规范、诚实公正、诚信守则、履行责任，理解个人与社会的关系，了解中国国情和有正确价值观。\n'
        self.gra_req_data['9'] = '个人和团队：能够在多学科背景下的团队中承担个体、团队成员以及负责人的角色。\n'
        self.gra_req_data['10'] = '沟通：能够就专业问题与业界同行、社会公众以及跨文化背景进行有效沟通和交流。\n'
        self.gra_req_data['11'] = '项目管理：能够将工程管理原理与经济决策基本方法运用于软件开发和系统设计。\n'
        self.gra_req_data['12'] = '终身学习：能自主学习计算机最新技术并应用于提升解决复杂工程问题能力以及终身学习的意识与能力。\n'

        self.idx_point['1'] = {
            '1': '能够将工科数学与自然科学的基本知识用于对工程问题的形式化表达、建模与求解。\n',
            '2': '能够将程序编写、算法设计相关的基础知识和技能应用于解决计算机工程领域的具体问题。\n',
            '3': '能够将计算机硬件、软件工程、计算系统等工程原理与系统知识应用于对相关系统进行分析与设计。\n',
            '4': '能够结合计算系统工程的专业知识选择相应的开发平台、工具与方法，实现对特定复杂工程问题的求解、系统设计与开发。\n'
        }
        self.idx_point['2'] = {
            '1': '能够运用数学、自然科学和计算机科学与技术的基本原理与方法，对复杂工程问题的模型关键因素进行识别、描述与判断。\n',
            '2': '能够将算法、软件开发和计算系统的基本分析方法和系统分层原理运用于分析复杂计算工程问题。\n',
            '3': '能够对复杂工程问题实施评价，并能提出多个可替代的解决或优化方案。\n',
            '4': '能够运用数学、自然科学和计算机科学的基本原理，对复杂计算工程问题解决方案的有效性开展分析与论证，并能获得有效结论。\n'
        }
        self.idx_point['3'] = {
            '1': '能够运用程序设计语言编写程序和实现算法求解复杂工程问题，理解软件设计和软件产品开发全周期、全流程的基本方法和技术。\n',
            '2': '掌握基于计算机硬件和软件相关的设计和开发技术，并能够将其运用于设计复杂计算系统。\n',
            '3': '能够针对领域应用需求，基于特定的平台或系统进行有创新的应用软件或系统设计。\n',
            '4': '在计算系统设计中能满足预期的需求，且能够考虑经济，环境，社会，政治，伦理，健康，安全，可制造性，和可持续性等约束。\n'
        }
        self.idx_point['4'] = {
            '1': '能够运用计算机科学与技术原理，通过调研和文献研究或相关研究初步方法，针对复杂工程问题提出有一定创新意义的解决方案。\n',
            '2': '能够根据领域特征，选择平台工具与技术路线，设计实验验证与评估方案。\n',
            '3': '能够构建安全的实验验证与评估系统，安全正确地验证与评估。\n',
            '4': '能够依据选用或设计的验证与评估方案，对实验结果进行分析和评估，并得出有效结论。\n'
        }
        self.idx_point['5'] = {
            '1': '能够使用常规电子仪器测试电子系统和用逻辑分析仪分析硬件系统逻辑。\n',
            '2': '能够选择与使用专业模拟软件，对复杂计算系统问题进行分析、计算与设计。\n',
            '3': '能够针对领域应用，选用满足特定需求的最新开发平台与工具并能够分析其特点，了解其局限性。\n',
            '4': '能够针对具体的问题，设计开发模拟软件并能够比较分析其有效性和局限性。\n'
        }
        self.idx_point['6'] = {
            '1': '能够描述公民与社会、健康、安全、法律、文化、政策的相关知识和基本内涵。\n',
            '2': '能够解释计算相关领域的技术标准体系、知识产权、产业政策和法律法规及对工程活动的影响。\n',
            '3': '能够分析和评价计算系统，特别是信息安全对社会、健康、安全、法律、文化的影响，以及这些制约因素对项目实施的影响和应承担的责任。\n'
        }
        self.idx_point['7'] = {
            '1': '能够描述环境保护的相关知识，并解释可持续发展的理念和内涵。\n',
            '2': '能够在设计计算应用系统时，考虑环境保护和可持续发展的影响以及这些制约因素对项目实施的影响，并理解应承担的责任。\n',
            '3': '能够在评价计算系统中，考虑系统可能对人类和环境造成的损害和隐患，特别是信息安全的隐患。\n'
        }
        self.idx_point['8'] = {
            '1': '能够描述中国国情，能够在正确的世界观、人生观、价值观中解释个人与社会的关系。\n',
            '2': '能够解释诚实公正、诚信守则的工程职业道德和规范，并能在工程实践中自觉遵守。\n',
            '3': '能够解释工程师对公众的安全、健康和福祉，以及环境保护的社会责任，并在工程实践中自觉履行责任。\n'
        }
        self.idx_point['9'] = {
            '1': '能够作为团队的一员进行有效的工作，与其他学科的成员有效沟通，合作共事。\n',
            '2': '能够在团队中独立或合作开展工作，能够管理好自己的学习和发展过程，包括对时间的管理、重点任务的 安排及进度的管理等。\n',
            '3': '能够组织、协调和指挥团队开展工作。\n'
        }
        self.idx_point['10'] = {
            '1': '能够就专业问题向各类听众，以口头、文稿、图表等方式，解释清楚技术问题及其解决方案。\n',
            '2': '能够用英语以语言和书面方式表达专业问题，在跨文化背景下能进行基本沟通和交流。\n',
            '3': '能够追踪专业领域的国际发展趋势、研究热点，分析和辨别世界不同文化的差异性和多样性。\n'
        }
        self.idx_point['11'] = {
            '1': '能够描述工程项目中涉及的基本管理与经济决策方法。\n',
            '2': '能够解释计算产品全周期、全流程的成本构成以及其中涉及的工程管理与经济决策问题。\n',
            '3': '能够基于多模型和平台，在设计开发解决方案的过程中运用工程管理与经济决策方法。\n'
        }
        self.idx_point['12'] = {
            '1': '能够在社会发展的大背景下，认识到自主和终身学习的必要性。\n',
            '2': '能够自主学习计算机最新技术并应用于解决复杂工程问题。\n'
        }

if __name__ == "__main__":
    pass
    # sup_cou = Supporting_Course('D:/Project/Matrix/', '计算机科学与技术')
    #
    # # 生成矩阵表，拉获取其中的数据
    # sup_cou.init()
    #
    # # 生成主要支撑课程的字典
    # sup_cou.get_support_dict()
    #
    # # 生成毕业要求和指标点的内容
    # sup_cou.get_data()
    #
    # # 生成标题
    # sup_cou.set_title()
    #
    # # 创建表格
    # sup_cou.create_table()
    #
    # # 填充表格内容
    # sup_cou.fill_content()

    # sup_cou.doc.save('Supporting_Course.docx')
